import { ref, reactive } from 'vue';
import { CODEENUM } from '@/config'
import { message } from 'ant-design-vue';

/**
 * 封装分页hook
 * @param {*} func 请求数据的 api 接口
 * @returns
 */
export function usePager(func) {

  /** 分页参数 */
  const pageInfo = reactive({
    page: 1,
    size: 10,
  })

  /** 返回数据及其他业务数据 */
  const pageState = reactive({
    btnStatus: 1,     // 加载按钮状态 1:可继续加载 2:已经加载完了，参考@/config【BTN_STATUS】
    loading: 0,
    list: [],         // 数据列表容器
    count: 0          // 数据总量
  })

  /**
   * 请求数据（仅获取数据方法使用）
   * @param {*} func 请求数据的方法 例：getArticleList
   * @param {*} params 其他自定义请求参数
   */
  const queryData = async (params = {}) => {
    const res = await func({ ...pageInfo, ...params })
    handleQuery(res)
    return res
  }

  /**
   * 处理返回参数（仅获取数据方法使用）
   * @param {*} param0 接口请求后返回的数据
   * @param {*} type   是否loadmore
   * @returns
   */
  const handleQuery = ({ data, code, msg }) => {
    if (code !== CODEENUM.GD_SUCCESS) return message.error(msg || '数据获取失败')
    pageState.count = data.count
    pageState.loading = false
    console.log(data.rows, pageState)

    if (data.rows.length === 0 || pageInfo.size > data.rows.length) {
      pageState.btnStatus = 2
    }
    if (pageInfo.page !== 1) pageState.list.push(...data.rows)
    else Reflect.set(pageState, 'list', data.rows)
  }

  /**
   * 加载更多
   */
  const loadingMore = (params = {}) => {
    if (pageState.btnStatus !== 1) return
    pageInfo.page += 1
    queryData(params)
  }

  return {
    pageInfo,
    pageState,
    queryData,
    loadingMore,
    handleQuery,
  }
}


export const useSearch = (searchFunc) => {
  let timeout;

  /** 异步节流请求数据方法 */
  function fetch(val) {
    if (timeout) {
      clearTimeout(timeout);
      timeout = null;
    }

    timeout = setTimeout(() => {
      searchFunc(val)
    }, 300);
  }

  const data = ref([]);
  const value = ref();

  const handleSearch = (val) => {
    fetch(val);
  };
  const handleChange = (val) => {
    value.value = val;
    fetch(val);
  };

  return {
    data, value, handleSearch, handleChange
  }
}
